By David Gershlick with help from numerous sources on the internet. Based on an imageJ macro written during my PhD at the University of Leeds


In [3]:
import Image
from PIL import Image, ImageDraw
import numpy as np
from pylab import *
#from ggplot import *
import pandas as pd
import prettyplotlib as ppl
import numpy as np
# prettyplotlib imports 
import matplotlib.pyplot as plt
import matplotlib as mpl
from prettyplotlib import brewer2mpl
%matplotlib inline

#change the file here to your file localtion to load it
Imageinput=r'/Volumes/PassportDG/Scatterplot.tif'
orig=Image.open(Imageinput, 'r').convert("RGBA")
slice1=Image.open(Imageinput, 'r').convert("RGBA")
slice2=Image.open(Imageinput, 'r').convert("RGBA")
slice3=Image.open(Imageinput, 'r').convert("RGBA")
slice4=Image.open(Imageinput, 'r').convert("RGBA")
slice5=Image.open(Imageinput, 'r').convert("RGBA")
slice6=Image.open(Imageinput, 'r').convert("RGBA")
slice7=Image.open(Imageinput, 'r').convert("RGBA")
slice8=Image.open(Imageinput, 'r').convert("RGBA")
slice9=Image.open(Imageinput, 'r').convert("RGBA")
slice10=Image.open(Imageinput, 'r').convert("RGBA")
slice11=Image.open(Imageinput, 'r').convert("RGBA")
slice12=Image.open(Imageinput, 'r').convert("RGBA")
slice13=Image.open(Imageinput, 'r').convert("RGBA")
slice14=Image.open(Imageinput, 'r').convert("RGBA")
slice15=Image.open(Imageinput, 'r').convert("RGBA")
slice16=Image.open(Imageinput, 'r').convert("RGBA")


---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-3-fd72f7660185> in <module>()
      7 get_ipython().magic(u'matplotlib inline')
      8 Imageinput=r'/Volumes/PassportDG/Scatterplot.tif'
----> 9 orig=Image.open(Imageinput, 'r').convert("RGBA")
     10 slice1=Image.open(Imageinput, 'r').convert("RGBA")
     11 slice2=Image.open(Imageinput, 'r').convert("RGBA")

/Users/davidgershlick/anaconda/lib/python2.7/site-packages/PIL/Image.pyc in open(fp, mode)
   1950         import __builtin__
   1951         filename = fp
-> 1952         fp = __builtin__.open(fp, "rb")
   1953     else:
   1954         filename = ""

IOError: [Errno 2] No such file or directory: '/Volumes/PassportDG/Scatterplot.tif'

Draw a segement of the image


In [2]:
draw = ImageDraw.Draw(slice1)
draw.polygon([(16,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels1 = slice1.load()
data1 = []
for x in range(256):
        for y in range(256):
            cpixel1 = pixels1[x, y]
            data1.append(cpixel1)

r1 = 0
g1 = 0
counter1 = 0

for x in range(len(data1)):
        if data1[x][3] > 0:
            r1+=data1[x][0]
            g1+=data1[x][1]
            counter1+=1;

rAvg1 = r1/counter1
gAvg1 = g1/counter1


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-2-ef15905d2289> in <module>()
----> 1 draw = ImageDraw.Draw(slice1)
      2 draw.polygon([(16,0),(0,256),(256,256),(256,0)],
      3                fill=(0,0,0,0),outline=(0,0,0,0))
      4 del draw
      5 

NameError: name 'slice1' is not defined

In [2]:


In [3]:
draw = ImageDraw.Draw(slice2)
draw.polygon([(64,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice2)
draw.polygon([(0,0),(0,256),(32,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

pixels2 = slice2.load()
data2 = []
for x in range(256):
        for y in range(256):
            cpixel2 = pixels2[x, y]
            data2.append(cpixel2)

r2 = 0
g2 = 0
counter2 = 0
 
for x in range(len(data2)):
        if data2[x][3] > 0:
            r2+=data2[x][0]
            g2+=data2[x][1]
            counter2+=1;

rAvg2 = r2/counter2
gAvg2 = g2/counter2

In [3]:


In [4]:
draw = ImageDraw.Draw(slice3)
draw.polygon([(96,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice3)
draw.polygon([(0,0),(0,256),(64,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
        
pixels3 = slice3.load()
data3 = []
for x in range(256):
        for y in range(256):
            cpixel3 = pixels3[x, y]
            data3.append(cpixel3)

r3 = 0
g3 = 0
counter3 = 0
 
for x in range(len(data3)):
        if data3[x][3] > 0:
            r3+=data3[x][0]
            g3+=data3[x][1]
            counter3+=1;

rAvg3 = r3/counter3
gAvg3 = g3/counter3

In [4]:


In [5]:
draw = ImageDraw.Draw(slice4)
draw.polygon([(128,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice4)
draw.polygon([(0,0),(0,256),(96,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
      
pixels4 = slice4.load()
data4 = []
for x in range(256):
        for y in range(256):
            cpixel4 = pixels4[x, y]
            data4.append(cpixel4)

r4 = 0
g4 = 0
counter4 = 0
 
for x in range(len(data4)):
        if data4[x][3] > 0:
            r4+=data4[x][0]
            g4+=data4[x][1]
            counter4+=1;
 
rAvg4 = r4/counter4
gAvg4 = g4/counter4

In [5]:


In [6]:
draw = ImageDraw.Draw(slice5)
draw.polygon([(160,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice5)
draw.polygon([(0,0),(0,256),(128,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels5 = slice5.load()
data5 = []
for x in range(256):
        for y in range(256):
            cpixel5 = pixels5[x, y]
            data5.append(cpixel5)

r5 = 0
g5 = 0
counter5 = 0
 
for x in range(len(data5)):
        if data5[x][3] > 0:
            r5+=data5[x][0]
            g5+=data5[x][1]
            counter5+=1;

rAvg5 = r5/counter5
gAvg5 = g5/counter5

In [6]:


In [7]:
draw = ImageDraw.Draw(slice6)
draw.polygon([(192,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice6)
draw.polygon([(0,0),(0,256),(160,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

pixels6 = slice6.load()
data6 = []
for x in range(256):
        for y in range(256):
            cpixel6 = pixels6[x, y]
            data6.append(cpixel6)
r6 = 0
g6 = 0
counter6 = 0
 
for x in range(len(data6)):
        if data6[x][3] > 0:
            r6+=data6[x][0]
            g6+=data6[x][1]
            counter6+=1;

rAvg6 = r6/counter6
gAvg6 = g6/counter6

In [7]:


In [8]:
draw = ImageDraw.Draw(slice7)
draw.polygon([(228,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice7)
draw.polygon([(0,0),(0,256),(192,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels7 = slice7.load()
data7 = []
for x in range(256):
        for y in range(256):
            cpixel7 = pixels7[x, y]
            data7.append(cpixel7)
            
r7 = 0
g7 = 0
counter7 = 0
 
for x in range(len(data7)):
        if data7[x][3] > 0:
            r7+=data7[x][0]
            g7+=data7[x][1]
            counter7+=1;
 
rAvg7 = r7/counter7
gAvg7 = g7/counter7

In [8]:


In [9]:
draw = ImageDraw.Draw(slice8)
draw.polygon([(256,0),(0,256),(256,256),(256,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice8)
draw.polygon([(0,0),(0,256),(228,0)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

pixels8 = slice8.load()
data8 = []
for x in range(256):
        for y in range(256):
            cpixel8 = pixels8[x, y]
            data8.append(cpixel8)

r8 = 0
g8 = 0
counter8 = 0
 
for x in range(len(data8)):
        if data8[x][3] > 0:
            r8+=data8[x][0]
            g8+=data8[x][1]
            counter8+=1;

rAvg8 = r8/counter8
gAvg8 = g8/counter8

In [9]:


In [10]:
draw = ImageDraw.Draw(slice9)
draw.polygon([(256,32),(0,256),(256,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice9)
draw.polygon([(0,0),(256,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
 
pixels9 = slice9.load()
data9 = []
for x in range(256):
        for y in range(256):
            cpixel9 = pixels9[x, y]
            data9.append(cpixel9)

r9 = 0
g9 = 0
counter9 = 0
 
for x in range(len(data9)):
        if data9[x][3] > 0:
            r9+=data9[x][0]
            g9+=data9[x][1]
            counter9+=1;

rAvg9 = r9/counter9
gAvg9 = g9/counter9

In [10]:


In [11]:
draw = ImageDraw.Draw(slice10)
draw.polygon([(256,32),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice10)
draw.polygon([(256,64),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels10 = slice10.load()
data10 = []
for x in range(256):
        for y in range(256):
            cpixel10 = pixels10[x, y]
            data10.append(cpixel10)

r10 = 0
g10 = 0
counter10 = 0 

for x in range(len(data10)):
        if data10[x][3] > 0:
            r10+=data10[x][0]
            g10+=data10[x][1]
            counter10+=1;
           
rAvg10 = r10/counter10
gAvg10 = g10/counter10

In [11]:


In [12]:
draw = ImageDraw.Draw(slice11)
draw.polygon([(256,64),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice11)
draw.polygon([(256,96),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels11 = slice11.load()
data11 = []
for x in range(256):
        for y in range(256):
            cpixel11 = pixels11[x, y]
            data11.append(cpixel11)

r11 = 0
g11 = 0
counter11 = 0
 
for x in range(len(data11)):
        if data11[x][3] > 0:
            r11+=data11[x][0]
            g11+=data11[x][1]
            counter11+=1;

rAvg11 = r11/counter11
gAvg11 = g11/counter11

In [12]:


In [13]:
draw = ImageDraw.Draw(slice12)
draw.polygon([(256,96),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice12)
draw.polygon([(256,128),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels12 = slice12.load()
data12 = []
for x in range(256):
        for y in range(256):
            cpixel12 = pixels12[x, y]
            data12.append(cpixel12)

r12 = 0
g12 = 0
counter12 = 0
 
for x in range(len(data12)):
        if data12[x][3] > 0:
            r12+=data12[x][0]
            g12+=data12[x][1]
            counter12+=1;
 
rAvg12 = r12/counter12
gAvg12 = g12/counter12

In [13]:


In [14]:
draw = ImageDraw.Draw(slice13)
draw.polygon([(256,128),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice13)
draw.polygon([(256,160),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels13 = slice13.load()
data13 = []
for x in range(256):
        for y in range(256):
            cpixel13 = pixels13[x, y]
            data13.append(cpixel13)

r13 = 0
g13 = 0
counter13 = 0

for x in range(len(data13)):
        if data13[x][3] > 0:
            r13+=data13[x][0]
            g13+=data13[x][1]
            counter13+=1;
 
rAvg13 = r13/counter13
gAvg13 = g13/counter13

In [14]:


In [15]:
draw = ImageDraw.Draw(slice14)
draw.polygon([(256,160),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice14)
draw.polygon([(256,192),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels14 = slice14.load()
data14 = []
for x in range(256):
        for y in range(256):
            cpixel14 = pixels14[x, y]
            data14.append(cpixel14)

r14 = 0
g14 = 0
counter14 = 0
 
for x in range(len(data14)):
        if data14[x][3] > 0:
            r14+=data14[x][0]
            g14+=data14[x][1]
            counter14+=1;
 
rAvg14 = r14/counter14
gAvg14 = g14/counter14

In [15]:


In [16]:
draw = ImageDraw.Draw(slice15)
draw.polygon([(256,196),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

draw = ImageDraw.Draw(slice15)
draw.polygon([(256,228),(256,256),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 
    
pixels15 = slice15.load()
data15 = []
for x in range(256):
        for y in range(256):
            cpixel15 = pixels15[x, y]
            data15.append(cpixel15)

r15 = 0
g15 = 0
counter15 = 0

for x in range(len(data15)):
        if data15[x][3] > 0:
            r15+=data15[x][0]
            g15+=data15[x][1]
            counter15+=1;
 
rAvg15 = r15/counter15
gAvg15 = g15/counter15

In [16]:


In [17]:
draw = ImageDraw.Draw(slice16)
draw.polygon([(256,228),(256,0),(0,0),(0,256)],
               fill=(0,0,0,0),outline=(0,0,0,0))
del draw 

    
pixels16 = slice16.load()
data16 = []
for x in range(256):
        for y in range(256):
            cpixel16 = pixels16[x, y]
            data16.append(cpixel16)

r16 = 0
g16 = 0
counter16 = 0
 
for x in range(len(data16)):
        if data16[x][3] > 0:
            r16+=data16[x][0]
            g16+=data16[x][1]
            counter16+=1;
 
rAvg16 = r16/counter16
gAvg16 = g16/counter16

In [17]:

Unhash the show commands below to see the slices


In [18]:
#slice1.show()
#slice2.show()
#slice3.show()
#slice4.show()
#slice5.show()
#slice6.show()
#slice7.show()
#slice8.show()
#slice9.show()
#slice10.show()
#slice11.show()
#slice12.show()  
#slice13.show()
#slice14.show()
#slice15.show()   
#slice16.show()

Arrays made using the slice data below


In [19]:
red_array = []
red_array.extend((rAvg1,rAvg2,rAvg3,rAvg4,rAvg5,rAvg6,rAvg7,rAvg8,
                  rAvg9,rAvg10,rAvg11,rAvg12,rAvg13,rAvg14,rAvg15,rAvg16))


Out[19]:
[0, 18, 38, 55, 66, 67, 59, 51, 49, 53, 61, 68, 75, 85, 101, 57]

In [20]:
green_array = []
green_array.extend((gAvg1,gAvg2,gAvg3,gAvg4,gAvg5,gAvg6,gAvg7,gAvg8,
                  gAvg9,gAvg10,gAvg11,gAvg12,gAvg13,gAvg14,gAvg15,gAvg16))


Out[20]:
[8, 93, 123, 126, 118, 97, 72, 53, 45, 43, 41, 37, 32, 26, 16, 3]

Graph the data


In [4]:
data = []
data = list(range(1, 17))
plt.plot(data, red_array, 'r+:', data, green_array, 'g+:')
plt.axis([1, 16, 0, 256])
figure_title = "Scatterplot Population Distribution"
plt.title(figure_title, y=1.08, fontsize=14) 
plt.fill_between(data, 0, green_array, facecolor='green', interpolate=True, alpha=0.1)
plt.fill_between(data, 0, red_array, facecolor='red', interpolate=True, alpha=0.1)
plt.xlabel('Area of Scatterplot')
plt.ylabel('Intensity of Colour')
plt.show()


---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-4-f188721f9824> in <module>()
      1 data = []
      2 data = list(range(1, 17))
----> 3 plt.plot(data, red_array, 'r+:', data, green_array, 'g+:')
      4 plt.axis([1, 16, 0, 256])
      5 figure_title = "Scatterplot Population Distribution"

NameError: name 'red_array' is not defined

In [ ]:
n_groups = 16

fig, ax = ppl.subplots()

index = np.arange(n_groups)
bar_width = 0.35

rects1 = ppl.bar(index, pseudo_green_array, bar_width,  grid='y')

rects2 = ppl.bar(index + bar_width, pseudo_red_array, bar_width,
                 alpha=0.5,
                 color='r', grid='y')

#rects3 = ppl.bar(index, sumlist, bar_width*2,
#                 alpha=opacity,
#                 color='w', annotate=False, grid='y', edgecolor='black')



plt.ylim([0, 256])
plt.xlabel('Segment of Scatterplot')
plt.ylabel('Mean Intenstity')
plt.title('Scatterplot Distribution')
plt.xticks(index + bar_width, ('1', '2', '3', '4', '5','6','7','8','9','10','11','12','13','14','15','16'))

plt.show()